#include <vector_types.h>
#include "../common.h"

int main(){
    // 首先要检查是否CUDA模块是否可用
    if(getCudaEnabledDeviceCount()==0){
        cerr<<"此OpenCV编译的时候没有启用CUDA模块"<<endl;
        return -1;
    }
    const int rows = 16*50;
    const int cols = 16*60;
    const int type = CV_8UC3;

    // 初始化一个黑色的GpuMat
    GpuMat gpuMat(rows,cols,type,Scalar(0,0,0));

}


int demo0(){
    // 首先要检查是否CUDA模块是否可用
    if(getCudaEnabledDeviceCount()==0){
        cerr<<"此OpenCV编译的时候没有启用CUDA模块"<<endl;
        return -1;
    }

    const int rows = 16*50;
    const int cols = 16*60;
    const int type = CV_8UC3;

    // 初始化一个黑色的GpuMat
    GpuMat gpuMat(rows,cols,type,Scalar(0,0,0));

    // 浅复制，gpuMat或gpuMat1两者的数据指针指向同一块区域
    GpuMat gpuMat1 = gpuMat;

    // 深复制,gpuMat2和gpuMat3的数据指针指向的数据区域和gpuMat的不同
    GpuMat gpuMat2 = gpuMat.clone();
    GpuMat gpuMat3;
    gpuMat.copyTo(gpuMat3);

    // 测试
    Mat dst1,dst2,dst3,dst4;
    // 把gpuMat设置为绿色
    gpuMat.setTo(Scalar(0,255,0));
    gpuMat.download(dst1);
    gpuMat1.download(dst2);
    gpuMat2.download(dst3);
    gpuMat3.download(dst4);
    imshow("dst1",dst1);//绿色
    imshow("dst2",dst2);//绿色
    imshow("dst3",dst3);//黑色
    imshow("dst4",dst4);//黑色
    waitKey(0);
}

int demo1() {
    // 首先要检查是否CUDA模块是否可用
    if(getCudaEnabledDeviceCount()==0){
        cerr<<"此OpenCV编译的时候没有启用CUDA模块"<<endl;
        return -1;
    }

    const int rows = 16*50;
    const int cols = 16*60;
    const int type = CV_8UC3;

    // 初始化一个黑色的GpuMat
    GpuMat gpuMat(rows,cols,type,Scalar(0,0,0));
    // 定义一个空Mat
    Mat dst;
    // 把gpuMat中数据下载到dst(从显存下载到内存)
    gpuMat.download(dst);
    // 显示
    imshow("show",dst);
    waitKey(0);

    // 读取一张图片
    Mat arr = imread("../../GpuMat/lena.jpg");
    imshow("show",arr);
    waitKey(0);

    // 上传到gpuMat(若gpuMat不为空，会先释放原来的数据，再把新的数据上传上去)
    gpuMat.upload(arr);
    // 定义另外一个空的GpuMat
    GpuMat gray;
    // 把gpuMat转换为灰度图gray
#ifdef OPENCV3
    cuda::cvtColor(gpuMat,gray,CV_BGR2GRAY);
#else
    gpu::cvtColor(gpuMat,gray,CV_BGR2GRAY);
#endif
    // 下载到dst，如果dst不为空，旧数据会被覆盖
    gray.download(dst);
    // 显示
    imshow("show",dst);
    waitKey(0);
    return 0;
}

